<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Uso Avan&ccedil;ado - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/zend.acl.advanced.html">Inglês (English)</a></li>
    <li><a href="../pt-br/zend.acl.advanced.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.acl.refining.html">Refinando Controles de Acesso</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.acl.html">Zend_Acl</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.amf.html">Zend_Amf</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="zend.acl.advanced" class="section"><div class="info"><h1 class="title">Uso Avançado</h1></div>
    

    <div class="section" id="zend.acl.advanced.storing"><div class="info"><h1 class="title">Armazenando ACL para Persistência de Dados</h1></div>
        

        <p class="para">
            <span class="classname">Zend_Acl</span> foi projetado de uma maneira que não requer nenhuma
            teconologia de backend em particular, como um banco de dados ou servidor de cache, para
            armazenamento de dados <acronym class="acronym">ACL</acronym>. Sua implementação completamente em
            <acronym class="acronym">PHP</acronym> permite que ferramentas personalizadas de admnistração sejam
            construídas sob <span class="classname">Zend_Acl</span> com relativa facilidade e flexibilidade.
            Muitas situações necessitam de alguma forma de manutenção da <acronym class="acronym">ACL</acronym> e
            <span class="classname">Zend_Acl</span> fornece métodos para estabelecer e consultar os
            controles de acesso de uma aplicação.
        </p>

        <p class="para">
            O armazenamento dos dados da <acronym class="acronym">ACL</acronym> é uma tarefa deixada para o
            desenvolvedor, visto que espera-se que os casos de uso possam variar muito de acordo com
            situações diversas. Por conta de <span class="classname">Zend_Acl</span> ser serializável,
            objetos <acronym class="acronym">ACL</acronym> podem ser serializados com a função
            <a href="http://php.net/serialize" class="link external">&raquo;  <span class="methodname">serialize()</span></a> do
            <acronym class="acronym">PHP</acronym> e o resultado pode ser armazenado em qualquer lugar que o
            desenvolvedor desejar, como um arquivo, banco de dados ou mecanismo de cache.
        </p>
    </div>

    <div class="section" id="zend.acl.advanced.assertions"><div class="info"><h1 class="title">Escrevendo Regras ACL Condicionais com Asserções</h1></div>
        

        <p class="para">
            Algumas vezes uma regra para permitir ou negar acesso de um papel a um recurso não deve
            ser absoluta, mas dependente de vários critérios. Por exemplo, suponha que certo acesso
            deva ser liberado, mas somente entre o horário entre 8h00 e 17h00. Outro exemplo seria
            negar um acesso por conta de uma requisição vinda de um <acronym class="acronym">IP</acronym> que foi
            identificado como fonte de abuso. <span class="classname">Zend_Acl</span> foi construído para
            suportar a implementação de regras baseadas em quaisquer condições que o desenvolvedor
            necessitar.
        </p>

        <p class="para">
            <span class="classname">Zend_Acl</span> fornece suporte para regras condicionais com
            <span class="classname">Zend_Acl_Assert_Interface</span>. Para utilizar a interface de asserção
            de regra, o desenvolvedor escreve uma classe que implemente o método
             <span class="methodname">assert()</span> da interface:
        </p>

        <pre class="programlisting brush: php">
class CleanIPAssertion implements Zend_Acl_Assert_Interface
{
    public function assert(Zend_Acl $acl,
                           Zend_Acl_Role_Interface $role = null,
                           Zend_Acl_Resource_Interface $resource = null,
                           $privilege = null)
    {
        return $this-&gt;_isCleanIP($_SERVER[&#039;REMOTE_ADDR&#039;]);
    }

    protected function _isCleanIP($ip)
    {
        // ...
    }
}
</pre>


        <p class="para">
            Uma vez que uma classe de asserção está disponível, o desenvolvedor deve fornecer uma
            instância de classe de asserção ao atribuir regras condicionais. Uma regra criada com
            uma asserção somente se aplica quando o método de asserção retorna
            <b><tt>TRUE</tt></b>.
        </p>

        <pre class="programlisting brush: php">
$acl = new Zend_Acl();
$acl-&gt;allow(null, null, null, new CleanIPAssertion());
</pre>


        <p class="para">
            O código acima cria uma regra condicional que permite acesso a todos os priviégios, para
            tudo e para todos, exceto quando o <acronym class="acronym">IP</acronym> solicitante está em uma
            &quot;lista negra&quot;. Se a requisição vem de um <acronym class="acronym">IP</acronym> que não é considerado
            &quot;confiável&quot; a regra não se aplicará. Um vez que a regra se aplica a todos os papéis,
            todos os recursos e todos os privilégios, um <acronym class="acronym">IP</acronym> &quot;não confiável&quot;
            resultará em uma recusa de acesso. Contudo, este é um caso especial, e deve ser
            entendido que para todos os outros casos (ex., quando um papel específico, recurso ou
            privilégio é especificado para a regra), um asserção falsa resultará na regra não sendo
            aplicada, e outras regras serão utilizadas para determinar se o acesso é permitido ou
            negado.
        </p>

        <p class="para">
            Ao método  <span class="methodname">assert()</span> de um objeto de asserção é passada a
            <acronym class="acronym">ACL</acronym>, o papel, recurso e privilégio de que a consulta de autorização
            (ex.,  <span class="methodname">isAllowed()</span>) se aplica, a fim de fornecer um contexto
            para que a classe de asserção possa determinar se suas condições são necessárias.
        </p>
    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.acl.refining.html">Refinando Controles de Acesso</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.acl.html">Zend_Acl</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.amf.html">Zend_Amf</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="reference.html">Refer&ecirc;ncia do Zend Framework</a></li>
  <li class="header up"><a href="zend.acl.html">Zend_Acl</a></li>
  <li><a href="zend.acl.introduction.html">Introdu&ccedil;&atilde;o</a></li>
  <li><a href="zend.acl.refining.html">Refinando Controles de Acesso</a></li>
  <li class="active"><a href="zend.acl.advanced.html">Uso Avan&ccedil;ado</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>